"""命令行接口模块"""

import argparse
import sys
import io
import contextlib
from pathlib import Path

from . import __version__
from .parser import SQLParser
from .writer import WordWriter


def main():
    """命令行主入口"""
    parser = argparse.ArgumentParser(
        description='数据库表结构说明文档生成工具 - 从SQL文件生成Word文档',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        epilog="""
示例:
  %(prog)s -i schema.sql -o output.docx -d mysql
  %(prog)s -i schema.sql -d postgres
  %(prog)s -v
        """
    )
    
    parser.add_argument(
        '-v', '--version',
        action='version',
        version=f'sql2doc {__version__}',
        help='显示版本信息并退出'
    )
    
    parser.add_argument(
        '-i', '--input',
        required=True,
        type=str,
        help='输入的SQL脚本文件路径（必须）'
    )
    
    parser.add_argument(
        '-o', '--output',
        type=str,
        default='schema_document.docx',
        help='输出的.docx文件路径（默认：schema_document.docx）'
    )
    
    parser.add_argument(
        '-d', '--dialect',
        type=str,
        choices=['mysql', 'postgres', 'kingbase'],
        default='mysql',
        help='指定数据库类型（默认：mysql）'
    )
    
    args = parser.parse_args()
    
    # 验证输入文件
    input_path = Path(args.input)
    if not input_path.exists():
        print(f"错误：输入文件不存在: {args.input}", file=sys.stderr)
        sys.exit(1)
    
    if not input_path.is_file():
        print(f"错误：输入路径不是文件: {args.input}", file=sys.stderr)
        sys.exit(1)
    
    if input_path.suffix.lower() != '.sql':
        print(f"警告：输入文件不是.sql格式: {args.input}", file=sys.stderr)
    
    # 执行解析和生成
    try:
        print(f"正在解析SQL文件: {args.input}")
        print(f"数据库类型: {args.dialect}")
        
        # 解析SQL（捕获并过滤sqlglot的警告消息）
        stderr_buffer = io.StringIO()
        with contextlib.redirect_stderr(stderr_buffer):
            sql_parser = SQLParser(dialect=args.dialect)
            tables = sql_parser.parse_file(str(input_path))
        
        # 过滤掉sqlglot的"contains unsupported syntax"警告
        stderr_output = stderr_buffer.getvalue()
        if stderr_output:
            # 只保留非sqlglot警告的输出
            filtered_lines = [
                line for line in stderr_output.split('\n')
                if line and 'contains unsupported syntax' not in line
            ]
            if filtered_lines:
                print('\n'.join(filtered_lines), file=sys.stderr)
        
        if not tables:
            print("警告：未找到任何表结构定义", file=sys.stderr)
            print(f"调试信息：请检查SQL文件是否包含有效的CREATE TABLE语句", file=sys.stderr)
            sys.exit(1)
        
        print(f"成功解析 {len(tables)} 张表")
        for table in tables:
            print(f"  - {table.name} ({len(table.columns)} 个字段)")
        
        # 生成Word文档
        print(f"正在生成Word文档: {args.output}")
        writer = WordWriter(dialect=args.dialect)
        writer.write_tables(tables, args.output)
        
        print(f"✓ 成功生成文档: {args.output}")
        
    except FileNotFoundError as e:
        print(f"错误：{e}", file=sys.stderr)
        sys.exit(1)
    except ValueError as e:
        print(f"错误：{e}", file=sys.stderr)
        sys.exit(1)
    except Exception as e:
        print(f"错误：处理过程中发生异常: {e}", file=sys.stderr)
        import traceback
        traceback.print_exc()
        sys.exit(1)


if __name__ == '__main__':
    main()

